/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.uch.syscom.hibernateSpringDao;

import java.util.ArrayList;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import pe.edu.uch.syscom.mapping.TbCliente;

/**
 *
 * @author Jose Tejada
 */
public class HSClienteDAOImpl extends HibernateDaoSupport implements HSClienteDAO {

    @Override
    public TbCliente findPorId( int iIdCliente ) {

        return (TbCliente) this.getSession().get( TbCliente.class, iIdCliente );

    }

    @Override
    public List<TbCliente> loadListaClientes( String sCampoBusqueda ) {
        Criteria criteria;
        criteria = this.getSession().createCriteria( TbCliente.class );
        criteria.add( Restrictions.eq( "activo", 1 ) );

        if ( sCampoBusqueda != null && !sCampoBusqueda.trim().isEmpty() ) {
            sCampoBusqueda = sCampoBusqueda.trim();
            criteria.add( Restrictions.disjunction().
                    add( Restrictions.like( "nombres", "%" + sCampoBusqueda + "%" ) ).
                    add( Restrictions.like( "apPaterno", "%" + sCampoBusqueda + "%" ) ).
                    add( Restrictions.like( "apMaterno", "%" + sCampoBusqueda + "%" ) ).
                    add( Restrictions.like( "email", "%" + sCampoBusqueda + "%" ) ).
                    add( Restrictions.like( "dni", "%" + sCampoBusqueda + "%" ) ) );

        }
        return criteria.list();
    }

    @Override
    public TbCliente getClientePorEmail( String sEmail ) {
        TbCliente tbCliente;
        try {
            tbCliente = getClientePorCampo( "email", sEmail );
        } catch ( Exception ex ) {
            tbCliente = null;
        }
        return tbCliente;
    }

    @Override
    public TbCliente getClientePorDni( String sDni ) {
        TbCliente tbCliente;
        try {
            tbCliente = getClientePorCampo( "dni", sDni );
        } catch ( Exception ex ) {
            tbCliente = null;
        }
        return tbCliente;
    }

    @Override
    public TbCliente getClientePorCampo( String sCampo, String sValor ) {
        return (TbCliente) this.getSession().
                createCriteria( TbCliente.class ).
                add( Restrictions.eq( sCampo, sValor ) ).
                add( Restrictions.eq( "activo", 1 ) ).
                uniqueResult();
    }

    @Override
    public void actualizarCliente( TbCliente tbCliente ) {
        this.getHibernateTemplate().saveOrUpdate( tbCliente );
    }

    @Override
    public void guardarCliente( TbCliente tbCliente ) {

        if ( tbCliente != null ) {
            this.getSession().save( tbCliente );
        }
    }

    @Override
    public List<TbCliente> buscarClientePorDNI( String sDatoBusq ) {
        List<TbCliente> lstTbCli;
        try {
            lstTbCli = this.getSession().createCriteria( TbCliente.class ).
                    add( Restrictions.like( "dni", "%" + sDatoBusq + "%" ) ).
                    add( Restrictions.eq( "activo", 1 ) ).list();
        } catch ( Exception ex ) {
            ex.printStackTrace();
            lstTbCli = new ArrayList<TbCliente>();
        }
        return lstTbCli;
    }
}
